home *** CD-ROM | disk | FTP | other *** search
- IK0POR.HLP 1991 Sept
-
- Notes on porting Kermit-370 to other operating systems. This document
- consists of three parts: a general specification of functionality, a
- detailed guide to some of the more arcane sections of system-specific
- code in Kermit-370, and a summary of all the modules within Kermit-CMS.
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- A. Feasibility.
-
- The following is a list of system-specific operations that must (or
- should) be performed by Kermit-370. Each item is labeled with its
- degree of importance and with the name(s) of the macro and/or routine(s)
- that perform the function. The importance level is marked with ">>" and
- the program components with "<<". Names of macros are further marked
- with asterisks; routines are usually coupled with function codes. The
- presence of both a macro and a routine indicates that the macro serves
- only to invoke the routine.
-
- TERMINAL FUNCTIONS
-
- 1. Read from the terminal with possible prompt. Return length read.
- Leave text in specified buffer (unedited, if possible). Should
- follow techniques of utility programs, if any, such that command
- procedures can issue Kermit subcommands (if possible).
- >> Essential.
- << * RTEXT
-
- 2. Display text at the terminal. Ok if system supplies a CRLF.
- >> Essential.
- << * WTEXT
-
- 3. Test for stacked lines of terminal (or pseudo-terminal) input.
- >> Cosmetic. Avoids extra prompts and synchronizes "banner" display
- at startup.
- << SUPFNC,7
-
- 4. Set up a new prompt string, if necessary, for subsequent terminal
- read requests.
- >> Only if needed for #1.
- << SUPFNC,11
-
- 5. Clear the screen (if possible).
- >> Cosmetic.
- << SCRNIO,0
-
- SYSTEM FUNCTIONS
-
- 6. Analyze user environment at startup and determine if suitable. Save
- any quantities needed and condition the line for entering commands.
- Determine, if possible, the terminal controller type insofar as that
- is necessary for establishing the method of file transfer.
- >> Essential.
- << SETMSG,1
-
- 7. Reperform system-dependent initialization after SET LINE command
- selects a new communication line.
- >> Needed for SET LINE subcommand.
- << SETMSG,5 + SCRNIO,3
-
- 8. Reverse any setup performed in #6 and clean up before returning to
- system.
- >> Essential.
- << SETMSG,4
-
- 9. Obtain free storage block of specified length. Return error code,
- if possible, when enough storage is not available. Method should
- be re-entrant if possible and must preserve registers 2-13 without
- recourse to the save area pointed to by R13.
- >> Essential.
- << * DMSFREE
-
- 10. Release free storage block of specified address and length.
- >> Essential.
- << * DMSFRET
-
- 11. Invoke the system HELP facility with optional operand string.
- >> Cosmetic, but very useful.
- << KHELP
-
- 12. Start typeout interception. If possible, this should include all
- possible terminal output regardless of source. At a minimum, it
- must result in messages from Kermit itself being saved in a buffer
- instead of displayed. The intercepted output may be stored wherever
- convenient.
- >> Needed for REMOTE operations in server mode.
- << SUPFNC,1
-
- 13. Stop interception and restore normal terminal functions.
- >> Needed for REMOTE operations in server mode.
- << SUPFNC,5
-
- 14. Retrieve intercepted messages and copy them, if necessary, to the
- Kermit disk buffer.
- >> Needed for REMOTE operations in server mode.
- << SUPFNC,2
-
- 15. Execute a host command (with or without interception). Generally,
- the command text may be of two different forms: either a text
- string extracted from a text buffer or a canonical, internal
- representation requiring perhaps less system overhead. Commands
- invoked by Kermit for purely internal purposes should be of the
- latter form. If possible, detect whether the command is legal
- before invoking it. Detect in any case whether the command is legal
- sooner or later.
- >> Cosmetic, but very useful. If necessary, a minimal set of host
- commands can be emulated.
- << SUPFNC,3
-
- 16. Retrieve original command string by which Kermit was invoked. This
- need not be done more than once (at startup).
- >> Needed for specifying a subcommand in original command line.
- << SUPFNC,6
-
- 17. Log off the current session.
- >> Needed for honoring BYE command.
- << SUPFNC,8
-
- 18. Wait for a specified time (in seconds).
- >> Needed for DELAY parameter and possibly for screen synchronizing.
- << SUPFNC,9
-
- 19. Return the current clock time (in centiseconds). The code is fully
- generic, even though the function is done in SUPFNC.
- >> Needed for statistics and long-packet optimizing.
- << SUPFNC,10
-
- DISK/FILE-SYSTEM FUNCTIONS
-
- 20. Select a "working directory" specified by a string extracted from
- a text buffer. The directory is, of course, a concept defined
- within the context of the operating system. Subsequent files are
- preferentially read from and written to the directory.
- >> Needed if the directory concept is implemented: CWD subcommand.
- << CWDSET
-
- 21. Show space available in the "working directory" or other area.
- >> Needed for the SPACE subcommand.
- << DSPACE
-
- 22. Open a disk file by name for input (or return a non-zero code in
- case of failure). If necessary, refer to default file attributes
- specified to Kermit to aid in locating the file. Return a data area
- filled with the file attributes and a pointer to a storage block
- reserved for controlling the I/O (a "ticket"). OPENF is a generic
- macro.
- >> Essential.
- << * OPENF I + DISKIO,1
-
- 23. Open a disk file by name for output (or return a non-zero code in
- case of failure). If the file already exists, prepare to either
- overwrite it or append to it as the occasion requires. If the file
- is to be extended, be sure its attributes are not altered. Return
- a data area and "ticket" as with opening for input.
- >> Essential.
- << * OPENF O + DISKIO,2
-
- 24. Test for the existence of a file by name. Return a data area with
- the file attributes if found.
- >> Essential.
- << * OPENF T + DISKIO,3
-
- 25. Close the file specified by a "ticket". The ticket should then be
- "blank", so that reclosing would have no ill effects. CLOSF is
- generic.
- >> Essential.
- << * CLOSF + DISKIO,4
-
- 26. Write a record out to a disk file specified by a "ticket". The data
- address and length must be subject to change with each invocation,
- but must be retained if not explicitly changed. A completion code
- of 13 must be returned if the write encounters a full disk. Any
- other I/O error must return some other non-zero code.
- >> Essential.
- << * WRITF + DISKIO,10
-
- 27. Read a record in from a disk file specified by a "ticket". The
- buffer address and length must be subject to change with each
- invocation, but must be retained if not explicitly changed. If line
- numbers are kept in predictable locations within each record, there
- must be an option to remove them before returning the length of data
- read. If the end of the file is reached, a completion code of 12
- must be returned. An error must return some other non-zero code.
- >> Essential.
- << * READF + DISKIO,9 or DISKIO,0
-
- 28. Update the disk directory for given file (specified by a "ticket")
- such that the file is still open for output.
- >> Needed for SET DEBUG SAVE subcommand.
- << * SAVEF + DISKIO,21
-
- 29. Set up disk directory search for files matching a given pattern
- name. This may entail as little as saving the pattern or as much
- as creating a file with the complete list of matches. Note: the
- former is dangerous in a multi-user system if the name space to be
- searched can be altered while Kermit is searching, especially if
- control blocks can be unchained. The latter approach also has a
- drawback, in that files can still be created or deleted after the
- "complete" list is made. NXTFSET is a generic macro.
- >> Needed for wildcard filespecs.
- << * NXTFSET + DISKIO,5
-
- 30. Fetch the next filespec from a directory search and get a pointer to
- a list of its file attributes. Must return a non-zero code if no
- more files (and must persist even if called repeatedly). NXTF is
- a generic macro.
- >> Needed for wildcard filespecs.
- << * NXTF + DISKIO,6
-
- 31. Clean up after a disk directory search.
- >> Needed for wildcard filespecs.
- << * NXTFSET END + DISKIO,7
-
- 32. Check candidate name of a directory for validity and accessibility.
- >> Needed for CWD subcommand.
- << * NXTFSET CWD + DISKIO,8
-
- 33. Test current directory (or environment) for sufficient disk space.
- >> Cosmetic, used for processing A-packets.
- << DISKIO,11
-
- 34. Analyze disk I/O error; set up error message and code. ERRF is a
- generic macro.
- >> Cosmetic, but useful.
- << * ERRF + DISKIO,12
-
- 35. Display directory information about specified file (possibly with
- wildcard notation).
- >> Needed for DIR subcommand. Cosmetic, but very useful.
- << DISKIO,13
-
- 36. Delete a specified file. ERASF is a generic macro.
- >> Cosmetic, but useful, especially for REMOTE server functions.
- << * ERASF + DISKIO,14
-
- 37. Rename a specified file.
- >> Cosmetic, but useful, especially for REMOTE server functions.
- << DISKIO,15
-
- 38. Copy a specified file.
- >> Cosmetic, but useful, especially for REMOTE server functions.
- << DISKIO,16
-
- 39. Parse input string for a filespec under a variety of circumstances.
- The name must be converted to a uniform internal format suitable for
- Kermit I/O routines.
- a) Native file for input (possible wild-card notation).
- b) Native file for output.
- c) Foreign filespec.
- d) TAKE file (input or output).
- e) Native file for utility operations.
- >> Essential.
- << FSPEC (q.v.)
-
- 40. Check a given filespec for uniqueness and either generate a unique
- new name if possible or return an error indication if necessary.
- Possibly query the user for permission to overwrite a file that
- already exists, provided the filespec was entered by hand.
- >> Essential.
- << FSPEC (q.v.)
-
- 41. Convert an internal filespec to the form for transmission.
- >> Essential.
- << FSPEC (q.v.)
-
- 42. Convert an internal filespec to the display form.
- >> Needed for STATUS display and transaction log.
- << FSPEC (q.v.)
-
- 43. Open a library *per se* for purposes other than transferring its
- members. OPENF is a generic macro.
- >> Useful if the concept of libraries is important.
- << * OPENF L + DISKIO,22
-
- 44. Skip over the first "n" records of a newly-opened input file.
- POINTF is a generic macro.
- >> Useful for SEND with line range.
- << * POINTF + DISKIO,23
-
- COMMUNICATION FUNCTIONS
-
- 45. Open a specified communication line for I/O (default to the terminal
- connection). Set parameters needed for transparent operation. The
- procedure may depend on the type of terminal (or line) controller
- and should include both linemode and fullscreen types. After the
- line is open, if it is the terminal, no display messages will be
- issued by Kermit, and messages from other sources should also be
- suppressed, if possible. These opening functions are to be divided
- into controller-specific (of which there may be different variants)
- and general.
- >> Essential.
- << TERMIO/SCRNIO,1 + SETMSG,2
-
- 46. Close the current communication line. Restore normal operation.
- The same division of functions obtains as in #45.
- >> Essential.
- << TERMIO/SCRNIO,2 + SETMSG,3
-
- 47. Write a packet to the communication line. If possible, control the
- entire contents, including terminators. Also, if possible and if
- Kermit will immediately be requesting a read, begin the following
- read operation so that there is no delay between the completion of
- the write and the readiness of the system to read -- this may be
- important in a heavily loaded time-sharing environment.
- >> Essential.
- << TERMIO/SCRNIO,4
-
- 48. Read a packet from the communication line. If possible, suppress
- any prompts the system might normally supply. If possible, arrange
- for a timer interrupt after a specified wait such that the I/O
- request can be cancelled.
- >> Essential.
- << TERMIO/SCRNIO,5
-
- 49. For fullscreen lines, write a message to the screen despite the line
- having been opened.
- >> Cosmetic, but useful.
- << SCRNIO,6
-
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- B. Hints.
-
- In general, the operation of porting Kermit-370 entails starting from
- one or more existing versions of the system-specific code (IKxMAC.ASM
- and IKxUTL.ASM) and replacing one set of system-specific code with
- another. Each subroutine has comments documenting the interface with
- the rest of the program, and a fair amount of the code itself deals with
- such bookkeeping details and can be carried over. Similarly, each macro
- begins with a brief function/syntax description. In one example
- (porting Kermit-370 to the MUSIC O.S.), about 2/3 of the final macro
- definition code had been carried across from CMS as well as about 2/5 of
- the final MUSIC-specific subroutine code. In all, only about 850 lines
- of non-comment code had to be written. In another example (porting to
- CICS), only about 1/2 of the macro definition code had been carried
- across, along with about 1/4 of the subroutine code.
-
- In some cases, particularly when the operating system is supplied in
- source form, it may be useful to examine the system code and macro
- definitions for helpful hints on the techniques of invoking system
- functions, manipulating filespecs, and the like. Care should be taken,
- of course, not to violate copyright restrictions.
-
- ------------------------------------------------------------------------
- Parameters.
-
- It is necessary to define the symbols in the SSYMS macro. A useful
- technique is to compare two existing variants to determine which
- symbols are always present. Items in the KSYSTF macro are also system-
- specific, and many of them are required in all variants; some are not
- required, but are generally useful (again, compare existing variants
- for tips).
-
- ------------------------------------------------------------------------
- Entry and exit conditions.
-
- Kermit at entry should have R13 -> 72-byte save area and R15 -> Kermit,
- and there must be a macro SAVE similar to that of MVS. If there is no
- system macro SAVE, Kermit must supply one itself. If necessary, that
- macro can distinguish between internal linkages (in which R13, R14, and
- R15 *must* follow type-I conventions) and the initial call from the
- system (which may be anything at all). The entry conditions for Kermit
- consist of two macro calls:
- SAVE (14,12),,&LABEL
- KMAIN ENTER
- plus code appropriate to internal linkages. &LABEL will be either GUPI
- or KERMIT. For internal linkages, that parameter is always "*". After
- the invocation of KMAIN, R13 must point to the original save area, of
- which the first 12 bytes must be unused, and if the values originally in
- R0 and R1 were important, they must be saved in bytes 20-27. KMAIN
- ENTER must assign free storage and zero-fill it; point register KWRKBASE
- at the storage, register KSUBBASE at Kermit, and R10 at COMMON; and set
- up pointers to the stack. KMAIN RETURN must release the storage,
- restore any registers necessary, and return to the system with the
- proper condition code (initially in R15).
-
- ------------------------------------------------------------------------
- FSPEC. Notes from source code:
-
- * Entry: R1->name field, R0=flags selecting operation (see below)
- * For parse operations, SCANPTR defines the input string.
- * For getting foreign or display filespec, R7->output buffer
- * Exit: if not FFNEW, then R15=0 if ok, 1 if ?, 2 if bad.
- * For R15=1 or 2 R3,R4 give message. ERRNUM may be leftover.
- *
- * Flags: Notes:
- * Tasks: FFRCF FFSND FFGET FFNEW
- * Parse RECV X set ROVR properly
- * Parse SEND 1st X
- * Parse SEND 2nd X X
- * Parse GET 1st X
- * Parse GET 2nd X X set ROVR properly
- * Parse F-packet (FFHDR) X X X
- * Parse for Generic(FFUTL) X X FFWLD: allow partial
- * Parse TAKE
- *
- * Get unique name X R15: 0=>ok, 1=>bad
- * Interactive name check X X R15: 0=>ok, 1=>bad
- * Get foreign name (FFENC) X X R15->end of string
- * Get display form (FFDSP) X X R15->end of string
-
- Further explanation of entry conditions -
- "name field" is a fixed-length string of length LFID to be filled with
- the internal representation of a file name. SCANPTR is a pair of
- pointers (LEN, ADR) of a character string to be parsed, typically a
- string typed by the user, possibly in lower case. Note: Kermit assumes
- that a file specification will fit into a string of no more than 256
- bytes, i.e., LFID must be <257.
-
- FSPEC parses out one filename at a time. There is, of course, the
- alternate command syntax for SEND that allows the user to specify a list
- of files. The only contribution of FSPEC to the parsing is to note the
- delimiter it finds after the name; the list control is managed by the
- generic code.
-
- SEND takes one or two parameters, namely, the native filename and,
- optionally, a different filename to send to the other Kermit. A
- reversed pair of parameters is taken for the GET subcommand: a required
- "foreign" filename and an optional overriding "native" one. Foreign
- filenames, since they depend on the system of the other Kermit, might be
- thought of as independent of the IBM/370 operating system, but
- Kermit-CMS offers a special syntax extension that isn't implemented in
- Kermit-TSO. Anyway, that is the meaning of SEND 1st, etc. The foreign
- filename, by the way, is stored in JFSPEC, which is a varying-length
- string in COMMON (one-byte length indicator, followed by a maximum of 47
- bytes). "Parse RECV", in case that's not clear, means grab the
- filename, if any, entered on the RECEIVE subcommand, and (as the Note
- says), set flag ROVR in FL1, if a filename is actually found. I also
- note that the code clears flag NMOK in FL4 (in the CMS version), but
- that happens to be part of the internal logic of FSPEC to avoid
- duplicate efforts in filename collision testing. "Parse F-packet" means
- grab a (valid) filename from the file header sent from the other Kermit.
- "Parse for Generic" means grab a filename from the text string sent by
- the other Kermit for one of the Generic Server mode commands. The
- corresponding Note says that FFWLD set in the input flags means that
- part or all of the filename can be omitted to indicate all matching
- files, as in the DIRECTORY command. "Parse TAKE" means grab a file name
- from the text of a TAKE subcommand.
-
- The difference between "Get unique name" and "Interactive name check" is
- that the latter is permitted to type out a message and query the user
- for further instructions if necessary (as might be the case when the
- user types RECEIVE DUP.FILE), while the former must either find a unique
- name, or return an error condition. "Get foreign name" means putting
- the foreign filespec into a buffer (in ASCII) with JFSPEC taking
- precedence over whatever is found at (R1). Finally, "Get display form"
- is just the reverse of the various parse operations: the internal
- representation is converted to conventional external representation
- (with excess blanks, if any, removed according to whatever convention
- holds).
-
- ------------------------------------------------------------------------
- FDB. File Descriptor Block + File Access Block:
-
- In IKxMAC.ASM, the FDBD macro has two parts, an FAB and FDB. The FAB is
- intended to map the operating system's macro, whereas the FDB is
- Kermit's local variables. Some of the variables in the FDB are used
- throughout the generic Kermit code. The common part begins at FDBD and
- includes everything mapped by FDBPAT macro, and also includes FABLRTR,
- which is a recent addition giving the maximum record length for output
- to a file (which may in CMS, for example, differ from the current
- largest record length).
-
- ------------------------------------------------------------------------
- Host command execution.
-
- Not all operating systems make it possible for one application program
- (such as Kermit) to invoke another. When that is not possible, Kermit
- should make an effort to emulate the basic file-management commands
- corresponding to DISKIO functions 13-16 plus the appropriate commands
- (even if the system doesn't have them) to invoke on-line help and to
- display a file at the terminal. For an example of how such emulation
- can be done, see function 3 of SUPFNC in the MUSIC version of Kermit.
- Some calls to SUPFNC are generated internally by Kermit-370 itself
- (these are identified by *not* having flag UCMD set in FL4). Such calls
- should not require any syntax checking and may, in fact, be already
- converted to a special "system" format, if any, suitable for passing
- directly to the command processor. The details of formatting and syntax
- check will, of course, be highly system-specific.
-
- ------------------------------------------------------------------------
- SCRNIO. Fullscreen packet I/O. See part C for calling sequence info.
-
- For the Series/1 interface (and whenever else possible), Kermit-370
- takes advantage of a Read chained to a Write to speed up the I/O.
- Actually, the operation is chained by the Series/1, so Kermit issues
- both a write and a read synchronized by a hardware interrupt from the
- Series/1.
-
- Fullscreen buffer limits are defined by symbols MAXWS and MAXRS set in
- macro SSYMS.
-
- In principle, all you need to know is the sequence of calls to SCRNIO.
- You can handle the system interface in any convenient manner. The
- sequence is (by R0 code): 1, 6 (with greetings message), 4, 5, 4, 5, ...
- 4, 5, 2. The value of WRRD determines whether a "4" means Write/Read
- (value is 5) or just Write (value is 0) -- that value will always be 5
- except possibly the last time. Even if WRRD is 0 on the last call with
- R0=4, there will still be a call with R0=5 just afterwards, followed by
- a call to release control of the screen.
-
- The difference between "4" and "6" is just that no read is required
- following a "6". Also, "6" is intended for displaying messages to the
- user, in case he's watching, but "4" is for sending to the micro Kermit.
-
- ------------------------------------------------------------------------
- TERMIO. Similar to SCRNIO in many respects.
-
- TTY buffer limits are defined by symbols MAXWT and MAXRT set in the
- macro SSYMS.
-
- The way to signal a timeout from TERMIO is to return a packet of exactly
- one character: an ASCII 'T'. You can see an example by looking at the
- TSO version.
-
- There is a potential problem for Kermit transfers that arises if the
- user has a printable character for any editing functions used in the
- interpretation by the system of terminal input. Examples of such
- functions include character-delete and line-end (both normally found
- only on line-mode terminals). If such a character appears in a packet
- sent to the 370, the packet will be mangled unless Kermit takes special
- precautions. CMS Kermit deals with the problem by noting the LINEDIT
- setting when it starts up, turning off LINEDIT during a protocol
- transfer, and restoring LINEDIT afterwards. TSO Kermit, on the other
- hand, simply suppresses the user's line and character deletes during a
- transfer (and simultaneously saves the current values) and then restores
- them afterwards. The functions of saving, changing, and restoring the
- edit characters would be performed under variants 1, 2, and 3,
- respectively, of SETMSG.
-
- ------------------------------------------------------------------------
- Type-out interception.
-
- Intercepting host command output depends on the operating system
- facilities. In any case, the info would go directly to the screen
- unless you first call SUPFNC,1 to start typeout interception. For
- example, under CMS that means intercepting all SVC's (and BALR's to the
- system typeout entry point) and copying the corresponding info into a
- buffer as it's generated (leaving x'15' separators). That sort of
- operation is self-pacing, so that the cleanup consists of nothing more
- than copying the end-of-buffer pointer into a global variable. Under
- TSO, the setup call creates a STACK entry such that the TSO-type
- utilities will write to a pre-allocated dataset. Cleanup in that case
- consists of closing the file and then reading the file into the buffer,
- again with X'15' (Newline) characters separating lines, and finally
- copying out the end-of-buffer pointer.
-
- If there's no general way to save the output of a class of utility
- programs, then you would just have to do what you can: put any
- preliminaries in SUPFNC,1 and the nitty-gritty (for, say, DIR) in
- DISKIO,13 with the buffer-read-back in SUPFNC,2/SUPFNC,5. You might
- want to get a copy of TSO Kermit to see how it does things.
-
- The expansion for WTEXT in the TSO version generates a call to a
- subroutine in COMMON which checks the interception flags and then either
- issues a TPUT or copies the info into the output buffer.
-
- ------------------------------------------------------------------------
- GUPI.
-
- Updates for Kermit-370 are in the same format as in CMS, except that the
- multi-level updates are applied from a single, concatenated file, rather
- than a flock of separate updates listed by an AUX. You should take a
- look at implementing the generic update program GUPI for your operating
- system.
-
- Bear in mind that there are almost always some updates to the base
- generic source, so the "package" for installation must include a means
- of applying those, and it would also be nice if subsequent changes,
- particularly generic changes, could be transmitted to all systems in the
- same form. In any case, instructions for applying updates should be
- included in the IKxKER.BWR file (see IKCKER.BWR for a pattern). It is
- pretty easy to make a GUPI, once you've got Kermit: just take subroutine
- DISKIO (functions 1, 2, 3, 4, 9, and 10) plus any associated data
- structures and tack on a command interface. GUPI uses the same macros
- as Kermit. You can see a working example by getting IKTGUP.ASM +
- IK0GUP.ASM from Columbia. The only complication is that you'll need to
- make a macro library consisting of the macros in IK0MAC.ASM, IKxMAC.ASM,
- and IKxGUP.ASM. The awkward (but workable) alternative would be to
- convert all the COPY blocks in GUPI into macros as the MUSIC version
- does. Making a macro libary is simplified by the structure of the code:
-
- a) All the pieces have *COPY cards imbedded appropriately (the source
- components have each macro preceded by a card of the form
- *COPY macro-name
- to improve legibility).
-
- b) The builder may concatenate all the pieces in any order, both for
- Kermit itself and GUPI, then change the *COPY cards into the
- appropriate member-separators, and finally run the result through a
- PDS (library) generator.
-
- c) The "real" source for Kermit or GUPI can then be a small skeleton
- which consists of comments and COPY instructions (which refer to
- members of the macro+source library).
-
- ------------------------------------------------------------------------
- Reentrancy.
-
- Kermit-370 is fully re-entrant in the generic sections, and provides a
- simple means for any system-specific code to be re-entrant as well. The
- ENTER, LOCALS, and EXIT macros can (and should) be used to begin a new
- routine, end the static code, and end the routine, respectively.
- Storage locations defined between the LOCALS and EXIT macros are
- allocated as temporary variables and initialized to zeroes for each
- invocation of the subroutine (and may be allocated recursively, if
- necessary). Sufficient stack space must be reserved for Kermit by
- setting the symbol STKDWDS in the SSYMS macro. The requirement is 18
- doublewords per subroutine call plus the sum of all temporaries (rounded
- up to doublewords) for the subroutines in the longest path. There is
- automatic overflow checking at each subroutine call performed by COMMON
- code routine named SUBENT. The result of overflow is an immediate
- return with an error code from the subroutine, but that may still lead
- to unpredictable consequences, and STKDWDS should be given generous
- proportions. When TEST is set on in Kermit-370, the STATUS subcommand
- displays the maximum extent of stack space used (in doublewords).
-
- ------------------------------------------------------------------------
- Miscellaneous notes.
-
- 1. Does your O.S. have a LINEND character facility like VM? If not, it
- might pay to copy the implementation of that from TSO Kermit. This
- will, of course, mean some changes to IKxMAC.
- 2. Would TAKE files generated by Kermit users tend to have line
- numbers imbedded? If so, it would pay to copy/adapt the stripping
- facility of TSO or CMS Kermit.
- 3. Does your O.S. have a way of timing out on a line-mode terminal read?
- The way to signal a timeout from TERMIO is to return a packet of
- exactly one character: an ASCII 'T'. You can see an example by
- looking at the TSO variant.
- *-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
- C. Module summary
-
- This summary was produced for Kermit-CMS 4.2.2. The system-specific
- modules vary (of course), but all should be quite similar to the
- CMS variant. Some of the differences lie in whether a particular
- entry point is treated as a separate routine or not.
-
- ALPHABETIC LIST OF SUBROUTINES
- Each item begins with a one-line description, possibly followed by more
- details, including entry and exit conditions and function. If any
- alternate entry points exist, each one is similarly described. Finally,
- all common references, callers, and calls are lists -- these are joint
- lists in the cases of routines with alternate entries.
-
- ACCTNG: save statistics for a transfer in the transaction log
- ENTRY ACCTST
- * add a new entry (name only) to the transaction log
- CALLERS- RECEIV SEND
-
- COMMON: Kermit-370 common routines/data areas
- CALLS- CWDSET DECODE DISKIO DUMP ENCODE FSPEC INTINI
- RIO RPACK RPAR SET SPACK SPAR STATUS
- SUPFNC
-
- CRCCLC: calculates crc
- * Calculate the CRC and return it in R15. Expects R5 to point to the
- * start of the data on which the CRC is calculated, and R6 to the
- * char after the last one.
- CALLERS- RPACK SPACK
-
- CWDSET (system-specific): set working directory
- * Set new 'working directory', i.e., filemode letter
- * Entry: SCANPTR string has option
- * Exit: R15=0 if ok, R15=1 if error or help needed. ERRNUM unchanged.
- ENTRY DSPACE
- * Show space in 'working directory' or other minidisk
- * Entry: SCANPTR string has option (none => working directory)
- * Exit: R15=0 if ok, R15=1 if error or help needed. ERRNUM unchanged
- COMMONS- COMMON
- CALLERS- COMMON SERVER SET
- CALLS- DISKIO
-
- DECODE: decode pkts from RDATA to WBUF
- * Exit: ERRNUM left unchanged unless there is an error.
- CALLERS- COMMON GENCMD RECEIV
- CALLS- OUTBUF
-
- DISKIO (system-specific): performs disk I/O functions
- * ERRNUM unchanged unless there is a disk error.
- * Function selected on entry by R0:
- * 0=> unnum: R1->FAB. Return R1->buffer,R0=# and remove the sequence
- * number (if any) from the buffer (used for TAKE files)
- * 1=> open (in): R1->pattern FDB, R2->name. Returns R0->FAB, R1->FDB
- * 2=> open (out): (same)
- * 3=> test name: R2->name. Returns R1->FDB if found (else R15=1)
- * 4=> close file: R1->adr(FAB).
- * 5=> set up search: R1->pattern name.
- * 6=> return next file in list: Returns R1->FDB + sets up FILNAM
- * 7=> close search (if any).
- * 8=> test CWD string: R1->string. Returns R15=0 if ok, else =1.
- * 9=> read: R1->FAB. Returns R15=12 if EOF, 0 if ok; R0=# data
- * 10=> write: R1->FAB. Returns R15=13 if disk full, 0 if ok.
- * 11=> test space: R1->pattern FDB (has size in Kbytes),
- * R2->name (used if FAB not found), R6->adr(FAB). Return R15=0 if ok.
- * 12=> analyze R/W error, set ERRNUM, make EMSG: R1->FAB, TMPDW=code
- * always returns R15=1
- * 13=> directory info on file: R1->name. Returns R15=0 if ok.
- * 14=> delete file: R1->name. Returns R15=0 if ok.
- * 15=> rename file: R1->name, R2->new name. Returns R15=0 if ok.
- * 16=> copy file: R1->name, R2->new name. Returns R15=0 if ok.
- * 21=> save file status in directory: R1->FAB. (not used)
- * 22=> open library (in): R2->DDNAME. Return R15=0 if ok.
- * 23=> point for next read, R1->adr(FDB), R2=records to skip.
- * Return R15=0 if ok.
- CALLERS- COMMON CWDSET DUMP FSPEC GENCMD INBUF KERMIT
- OUTBUF RECEIV RIO SEND SERVER SET USNTRF
- CALLS- SUPFNC
-
- DUMP: show translation table or transaction log
- * Display current contents of table or log
- * Entry: SCANPTR string has option
- * Exit: R15=0 if ok, R15=1 if error or help needed. ERRNUM unchanged.
- ENTRY DUMPTOD
- * Extra entry point for dumping TOD (in sec) from R0 into buf
- * at R1 and return updated buffer ptr in R15
- ENTRY GIVTAB
- * Save current translation table in STORAG into a TAKE file on disk
- * Entry: SCANPTR string has option
- * Exit: R15=0 if ok, R15=1 if error or help needed. ERRNUM set
- * appropriately as long as command syntax is ok, else unchanged.
- COMMONS- ERRTAB
- CALLERS- COMMON SCRNIO
- CALLS- DISKIO FSPEC STATUS TBLSET
-
- ENCODE: encode from RBUF into SDATA buffer
- CALLERS- COMMON SEND
- CALLS- INBUF
-
- ERPACK: send error packet based on ERRNUM
- COMMONS- ERRTAB
- CALLERS- GENCMD RECEIV SEND SERVER
- CALLS- SPACK STATUS
-
- FOPSTR: test string for file options
- * Entry: R1->Address of option field, R6->string, R7=length - 1
- * Exit: R15=0 + R6,R7 fixed if ok, R15=1 if error (msg ptrs set up)
- CALLERS- FSPEC
-
- FSPEC (system-specific): extract filespec from scan string
- * Entry: R1->name field, R0=flags selecting operation (see below)
- * For parse operations, SCANPTR defines the input string.
- * For getting foreign or display filespec, R7->output buffer
- * Exit: if not FFNEW, then R15=0 if ok, 1 if ?, 2 if bad.
- * For R15=1 or 2 R3,R4 give message. ERRNUM may be leftover.
- * See part B for calling flags.
- CALLERS- COMMON DUMP GENCMD RECEIV SERVER SET USNTRF
- CALLS- DISKIO FOPSTR
-
- GENCMD: send a Generic command
- * Entry: SCANPTR has string
- * Exit: R15=0 if ok, 1 if help needed, 2 if bad parameter
- * ERRNUM set appropriately
- CALLERS- USNTRF
- CALLS- DECODE DISKIO ERPACK FSPEC INTINI OUTBUF RECEIV
- SEND
-
- INBUF: read next disk record into RBUF
- * Exit: R15=0 if ok, -1 if EOF, 1 if read error (ERRNUM set)
- CALLERS- ENCODE NPREAD
- CALLS- DISKIO
-
- INTINI: Initialize/reset terminal for protocol
- * If R1 is 0, reset for interactive unless in Server mode.
- * If R1 is positive, set up for protocol:
- * 1 for SERVER, 2 for SEND, 3 for RECEIVE, 4 for short msg
- * R15 = 0 on return if ok
- CALLERS- COMMON GENCMD SEND SERVER USNTRF
- CALLS- SCRNIO SUPFNC TERMIO
-
- KERMIT: main entry point
- * Assign buffers, initialize STORAG section; do Kermit; return.
- COMMONS- COMMON KSYSNIT
- CALLS- DISKIO SCRNIO SPAR TBLSET USNTRF
-
- KHDMP: dump storage to log file (not generated unless &KTRACE is YES)
- * Dump area to log
- * Entry: R1->area, R0=length, R2-> 8-byte title for area
- * Exit: R15=0 if ok
-
- KHELP (system-specific): perform HELP command
- * Handle HELP command, rest of string given by SCANPTR.
- COMMONS- SETCMDS
- CALLERS- USNTRF
- CALLS- SUPFNC
-
- NPREAD: copy from RBUF to SDATA buffer (no encoding)
- CALLERS- SEND
- CALLS- INBUF
-
- OPTPKT: compute optimum packet size
- * Entry: TINSV contains stack of data
- * Exit: R15=0 if no limit, else optimum packet size (per algorithm)
- CALLERS- SEND STATUS
-
- OUTBUF: write record from WBUF to a disk file
- * Entry: R1=length of buffer (which starts where WBUF points)
- * Exit: R15=0 if ok, other if error (ERRNUM set)
- CALLERS- DECODE GENCMD RECEIV
- CALLS- DISKIO
-
- RECEIV: receives a file
- * Receive file(s) and set ERRNUM appropriately
- * Entry: filespec in FILNAM if ROVR is set, latest received packet
- in buffer
- COMMONS- COMMON
- CALLERS- GENCMD SERVER USNTRF
- CALLS- ACCTNG DECODE DISKIO ERPACK FSPEC OUTBUF RPACK
- RPAR SPAR SUPFNC TBLSET
-
- RIO: Read packet into receive packet buffer
- ENTRY SIO
- * Send packet in SNDPKT
- CALLERS- COMMON RPACK SEND SPACK
- CALLS- DISKIO SCRNIO TERMIO
-
- RPACK: Read and validate a packet
- * ERRNUM set if error found, unchanged otherwise
- CALLERS- COMMON RECEIV
- CALLS- CRCCLC RIO
-
- RPAR: sets up parms to send to other host
- ENTRY RPARSET
- * set up for exchange (RPAR to be called 1st)
- CALLERS- COMMON RECEIV SEND SERVER
- CALLS- SCRNIO TERMIO
-
- SCRNIO (system-specific): Handle screen I/O via protocol converter
- * R1 points to a pair of (adr,len) for read or write. If I/O is
- * successfull, R15 returns transferred byte count (else returns -1).
- * Command code is in R0:
- * 0 => Clear screen on console (not comm line)
- * 1 => Open screen for I/O 4 => Write packet
- * 2 => Close screen 5 => Read packet
- * 3 => Reset screen status after 6 => Write message (no ATTN)
- * environment changes 7 => Read screen buffer
- ENTRY SETMSG
- * Entry: R1 selects operation
- * Exit: R15=0 if ok
- * 1-> Analyze user environment, determine if suitable.
- * Save quantities needed and condition line for entering commands.
- * Perform any system-dependent initialization.
- * 2-> Condition line for protocol transfers.
- * 3-> Decondition line at end of transfer.
- * 4-> System-dependent clean-up at exit.
- * 5-> Reperform system-dependent initialization after SET LINE.
- COMMONS- KSYSNIT
- CALLERS- INTINI KERMIT RIO RPAR SET SUPFNC
- CALLS- DUMP USNTRF
-
- SEND: sends a file
- * Send file(s) and set ERRNUM appropriately
- * Entry: filespec pattern in IFILE, Disp code (if any) in R1
- CALLERS- GENCMD SERVER USNTRF
- CALLS- ACCTNG DISKIO ENCODE ERPACK INTINI NPREAD OPTPKT
- RIO RPAR SPAR SUPFNC
-
- SERVER: performs Server mode functions
- * Exit: ERRNUM set appropriately.
- CALLERS- USNTRF
- CALLS- CWDSET DISKIO ERPACK FSPEC INTINI RECEIV RPAR
- SEND SPAR SUPFNC USNTRF
-
- SET: perform SET command options
- * Set/change values in STORAG.
- * Entry: SCANPTR string has option
- * Exit: R15=0 if ok, 1 if help needed, 2 if bad parameter name
- * ERRNUM unchanged
- ENTRY SHOW
- * Display current values in STORAG.
- * Entry: SCANPTR string has option
- * Exit: R15=0 if ok, 1 if help needed, 2 if bad parameter name
- * ERRNUM unchanged
- COMMONS- SETCMDS ETCETERA
- CALLERS- COMMON
- CALLS- CWDSET DISKIO FSPEC SCRNIO SETCMDS SUPFNC TBLSET
-
- SPACK: fill sending packet buffer and send it
- CALLERS- COMMON ERPACK USNTRF
- CALLS- CRCCLC RIO
-
- SPAR: use parms from other host in RDATA
- ENTRY SPARSET
- * set up for exchange (SPAR to be called 1st)
- CALLERS- COMMON KERMIT RECEIV SEND SERVER
-
- STATUS: display latest error (if any), transfer statistics, etc.
- * Exit: R15=0. ERRNUM unchanged.
- ENTRY PEMSG
- * Display just error message and its backup explanations.
- COMMONS- ERRTAB
- CALLERS- COMMON DUMP ERPACK USNTRF
- CALLS- OPTPKT
-
- SUPFNC (system-specific): various supervisor functions
- * On entry, R1 = operation code, R0 = possible ptr
- * Exit: R15 set (0 => ok, <0 => illegal cmd, >0 => depends)
- * ERRNUM set appropriately (R1=1,3,4) or unchanged (2,5-11)
- * 1 -> Start typeout interception. N.B. &MAXLR >> 2048 for this
- * 2 -> Clean up afterwards and stop interception
- * 3 -> Execute host command with or without interception
- * If UCMD set, SCANPTR gives text, else R0->text,R6=len
- * 4 -> Execute CP command with or without interception
- * R0->text, R6=len
- * 5 -> Stop interception if going
- * 6 -> Retrieve original cmd parm string into CBUF (R15=1 if null)
- * 7 -> Test for stacked lines, return number in R15
- * 8 -> Log off (doesn't return!)
- * 9 -> Wait specified time
- * 10-> Return clock time in R15 (centisec)
- * 11-> Setup up new prompt string at (R0)
- CALLERS- COMMON DISKIO INTINI KHELP RECEIV SEND SERVER
- SET USNTRF
- CALLS- SCRNIO
-
- TBLSET: set up character set
- * Define new translation tables
- * Entry: Names of table in TRNALF and FILALF, R1->tables
- * R0->item just changed, if any (else, 0)
- * Tables should be a pair with ATOE first
- * Exit: R15=0 if ok, R15=1 if error ERRNUM unchanged.
- ENTRY TBLATT
- * Entry: R6->Designator string, R7=length
- * Exit: Correct table set up and R15=0 if ok, else 1
- COMMONS- COMMON TRNTBLD
- CALLERS- DUMP KERMIT RECEIV SET
-
- TERMIO (system-specific): Handle terminal I/O
- * R1 points to a pair of (adr,len) for read or write. If I/O is
- * successfull, R15 returns transferred byte count (else returns -1).
- * Command code is in R0:
- * 1 => Open line for I/O 4 => Write packet
- * 2 => Close line 5 => Read packet
- * 3 => Reset line status after ( 6 => Write message ) not used
- * environment changes ( 7 => Read buffer ) not used
- COMMONS- COMMON
- CALLERS- INTINI RIO RPAR
-
- USNTRF: execute main loop
- * Execute Kermit commands (beginning with default TAKE files)
- * Entry: environment already set up
- * Exit: R15=0, ERRNUM set appropriately
- COMMONS- COMMON
- CALLERS- KERMIT KHELP SCRNIO SERVER
- CALLS- DISKIO FSPEC GENCMD INTINI KHELP RECEIV SEND
- SERVER SPACK STATUS SUPFNC
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- ALPHABETIC LIST OF COMMON BLOCKS
-
- COMMON: Kermit-370 common data areas
- USED BY- CWDSET KERMIT KSYSNIT RECEIV TBLSET TERMIO USNTRF
-
- ERRMSGS: text of error messages
- USED BY- ERRTAB
-
- ERRTAB: List of error messages
- COMMONS- ERRMSGS
- USED BY- DUMP ERPACK STATUS
-
- ETCETERA: overflow from COMMON
- USED BY- SET
-
- KSYSNIT: initial parameter values
- USED BY- KERMIT SCRNIO
-
- SETCMDS: tables of command keywords
- USED BY- KHELP SET
-
- TRNTBLD: translation tables and variations thereon
- USED BY- TBLSET
-